package com.iot.ic.tcp.parse;


import com.iot.ic.tcp.DataType;
import com.iot.ic.tcp.utils.ByteUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;


/**
 * 解析工具类，解析设备发过来的数据
 * 
 * @author xiuge 2016年10月12日下午2:49:52
 */
public class DataParse {

	private Logger logger = LoggerFactory.getLogger(DataParse.class);
	/**
	 * 解析上传数据
	 * @param dataList
	 * @return
	 */
	public static Map<Byte, Map<Byte, Object>> parseData(LinkedList<Byte> dataList) {
		Map<Byte, Map<Byte, Object>> requestMap = new HashMap<Byte, Map<Byte, Object>>();
		while (dataList.size() > 0) {
			byte chType = dataList.get(1);// 通道类型
			Map<Byte, Object> chMap = requestMap.get(chType);
			if (chMap == null) {
				chMap = new HashMap<Byte, Object>();
				requestMap.put(chType, chMap);
			}
			int length = dataList.get(0);// 获取下一个数据的总字节数量长度
			int dataType = dataList.get(2);// 获取数据类型
			Byte[] data = nextData(dataList, length);// 获取该数据除去长度字节的内容
			switch ((byte) (dataType & 0xff)) {
			case DataType.Data.TIME:// 时间
				Date date = ByteUtil.readTime(data);
				chMap.put(DataType.Data.TIME, date);
				break;
			case DataType.Data.CHARGE:// 充电状态
				byte chargeState = data[0];
				chMap.put(DataType.Data.CHARGE, chargeState);
				break;
			case DataType.Data.POWER:// 电量
				int power = data[0];
				chMap.put(DataType.Data.POWER, power);
				break;
			case DataType.Data.SIGNAL_INTENSITY:
				int singnal=data[0];
				chMap.put(DataType.Data.SIGNAL_INTENSITY, singnal);
				break;
			case DataType.Data.UPLOAD_STEP:// 上传间隔
				int step = ByteUtil.getShort(data);
				chMap.put(DataType.Data.UPLOAD_STEP, step);
				break;
			case DataType.Data.CHANNEL:// 通道数量
				short channel = data[0];
				chMap.put(DataType.Data.CHANNEL, channel);
				break;
			case DataType.Data.RECORD_TYPE:// 数据类型 0：实时正常记录， 1：重传正常记录， 2：实时异常记录， 3：重传异常记录。
				byte fault = data[0];
				chMap.put(DataType.Data.RECORD_TYPE, fault);
				break;
			case DataType.Data.ALARM:
				byte alarm = data[0];
				chMap.put(DataType.Data.ALARM, alarm);
				break;
			case DataType.Data.IP_PORT:// ip和端口
				String ipAndPort = ByteUtil.readIpAndPort(data);
				chMap.put(DataType.Data.IP_PORT, ipAndPort);
				break;
			case DataType.Data.ROM_ORDER:// 
				int romOrder=ByteUtil.getShort(data);
				chMap.put(DataType.Data.ROM_ORDER, romOrder);
				break;
			case DataType.Data.ROM_VERSION:// ip和端口
				short romVersion = data[0];
				chMap.put(DataType.Data.ROM_VERSION, romVersion);
				break;
			case DataType.Data.SETTING_RESPONSE:
				byte settingResponse=data[0];
				chMap.put(DataType.Data.SETTING_RESPONSE, settingResponse);
				break;
			case DataType.Data.HUMIDITY:// 湿度
				int humidity = data[0];
				chMap.put(DataType.Data.HUMIDITY, humidity);
				break;
			case DataType.Data.TEMPERATURE:// 温度
				float temperature = ByteUtil.getFloat(data);
				chMap.put(DataType.Data.TEMPERATURE, temperature);
				break;
			case DataType.Data.MAX_TEM:// 温度上限
				Float maxTem = ByteUtil.getFloat(data);
				chMap.put(DataType.Data.MAX_TEM, maxTem);
				break;
			case DataType.Data.MIN_TEM:// 温度下限
				Float minTem = ByteUtil.getFloat(data);
				chMap.put(DataType.Data.MIN_TEM, minTem);
				break;
			case DataType.Data.MAX_HUM:// 湿度上限
				float maxHum = data[0];
				chMap.put(DataType.Data.MAX_HUM, maxHum);
				break;
			case DataType.Data.MIN_HUM:// 湿度下限
				float minHum = data[0];
				chMap.put(DataType.Data.MIN_HUM, minHum);
				break;
			case DataType.Data.SENSOR_CODE:
				byte sensorCode=data[0];
				chMap.put(DataType.Data.SENSOR_CODE, sensorCode);
				break;
			case DataType.Data.CH_FAULT:
				byte chFault=data[0];
				chMap.put(DataType.Data.CH_FAULT, chFault);
				break;
			case DataType.Data.PM:
				int pm=ByteUtil.getShort(data);
				chMap.put(DataType.Data.PM, pm);
				break;
			case DataType.Data.FORMALDEHYDE:
				int formaldehyde=ByteUtil.getShort(data);
				chMap.put(DataType.Data.FORMALDEHYDE, formaldehyde);
				break;
			default:
				break;
			}
		}
		return requestMap;
	}

	/**
	 * 根据指定长度获取下一个的数据的字节链表，并在原链表中减去该链表
	 * 
	 * @param data
	 * @return
	 */
	public static Byte[] nextData(LinkedList<Byte> data, int length) {
		if (data.size() < length) {
			return null;
		}
		LinkedList<Byte> list = new LinkedList<Byte>(data.subList(0, length + 1));
		for (int i = 0; i < length + 1; i++) {
			data.pollFirst();
		}
		Byte[] bytes = list.subList(3, list.size()).toArray(new Byte[list.size() - 3]);// 获取数据字节列表
		return bytes;
	}

	/**
	 * 根据指定长度获取下一个的数据的字节链表，并在原链表中减去该链表
	 *
	 * @param data
	 * @return
	 */
	public static LinkedList<Byte> nextDataList(LinkedList<Byte> data, int length) {
		if (data.size() < length) {
			return null;
		}
		LinkedList<Byte> list = new LinkedList<Byte>(data.subList(0, length));
		for (int i = 0; i < length; i++) {
			data.pollFirst();
		}
		return list;
	}





}
